# coding: utf-8

'''
-----------------------------------------
Exemplos de atributo dinâmico
-----------------------------------------

    >>> j = Aluno('Juca', 7)
    >>> j.idade
    7
    >>> j.idade = -3
    Traceback (most recent call last):
      ...
    ValueError: A idade nao pode ser negativa.
    >>> j.idade
    7
    >>> j.idade = 5
    Traceback (most recent call last):
      ...
    ValueError: A idade nao pode ser reduzida.
    >>> j = Aluno('Maria', -1) # <-- esta atribuicao nao acontece
    Traceback (most recent call last):
      ...
    ValueError: A idade nao pode ser negativa.
    >>> j.nome
    'Juca'
    >>> j.saldo = -10
    >>> j.saldo
    -10
    
'''

class Aluno(object):
    __idade = 0
    def __init__(self, nome, idade):
        self.nome = nome
        self.set_idade(idade)
        
    def set_idade(self, valor):
        if valor < 0:
            raise ValueError('A idade nao pode ser negativa.')
        elif valor < self.__idade:
            raise ValueError('A idade nao pode ser reduzida.')
        self.__idade = valor
        
    def get_idade(self):
        return self.__idade
        
    idade = property(get_idade, set_idade)        
        
    '''
    def __setattr__(self, atrib, valor):
        if atrib == 'idade': 
            if valor < 0:
                raise ValueError('A idade nao pode ser negativa.')
            elif hasattr(self, 'idade') and valor < self.idade:
                raise ValueError('A idade nao pode ser reduzida.')
        super(Aluno, self).__setattr__(atrib, valor)    
    '''

if __name__=='__main__':
    import doctest
    doctest.testmod()

